package com.shell.context.controller;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.shell.bee.base.annotation.Logging;
import com.shell.bee.base.utils.StringUtil;
import com.shell.bee.entity.auth.AuthUser;
import com.shell.context.service.ContextService;
import com.shell.context.utils.ContextCache;
import com.shell.framework.utils.CommonDataUtil;

@RestController
@RequestMapping({ "/context/" })
public class ContextController {
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	RestTemplate restTemplate;
	@Value("${context.msg.serviceApp}")
	private String serviceApp;
	@Autowired
	private LoadBalancerClient loadBalancerClient;
	@Autowired
	private ContextService contextService;

	@RequestMapping({ "get-context-data" })
	@Logging(methods = "������������")
	@ResponseBody
	public Map<String, Object> getContextData() throws Exception {
		Map<String, Object> m = ContextCache.getValue();

		AuthUser user = CommonDataUtil.getCurUser();
		String cusState = this.contextService.getCusState(CommonDataUtil.getCurEntId());
		user.getEnt().setCusState(cusState);
		m.put("user", user);
		return m;
	}

	@RequestMapping({ "refresh-context-data" })
	@Logging(methods = "����������������")
	@ResponseBody
	public Map<String, Object> refreshContextData() throws Exception {
		return ContextCache.refresh();
	}

	@RequestMapping({ "get-platform-params" })
	@Logging(methods = "����/����������������")
	public Map<String, Object> getPlatformParams() {
		return this.contextService.getPlatformParams(CommonDataUtil.getCurEntId(),
				CommonDataUtil.getCurEnt().getCusType());
	}

	@RequestMapping({ "msg-tip/get-msg-tip" })
	@Logging(methods = "����������������")
	@ResponseBody
	public Map<String, Object> getMsgTip(String key) throws Exception {
		if (StringUtil.empty(this.serviceApp)) {
			this.logger.info("��������������������������������������");
			return null;
		}
		String[] serviceList = this.serviceApp.split(",");

		Map<String, Object> data = new HashMap();

		MultiValueMap<String, Object> map = new LinkedMultiValueMap();
		map.add("key", key);
		map.add("cusId", CommonDataUtil.getCurEntId());
		map.add("userId", CommonDataUtil.getUserId());
		map.add("authUser", CommonDataUtil.getCurUser());

		ServiceInstance serviceInstance = null;
		for (String serviceName : serviceList) {
			serviceInstance = this.loadBalancerClient.choose(serviceName);
			if (serviceInstance == null) {
				this.logger.error("��������������������������������" + serviceName);
			} else {
				this.logger.info("��������������--------->" + serviceInstance.getUri().toString() + "/" + serviceName
						+ "/getMsgTip");
				Map<String, Object> msgData = (Map) this.restTemplate.postForObject(
						serviceInstance.getUri().toString() + "/" + serviceName + "/getMsgTip", map, Map.class,
						new Object[0]);
				if (null != msgData) {
					data.putAll(msgData);
				}
			}
		}
		return data;
	}
}